﻿using LM.InterfacesFabricas.DTOs;
using LM.InterfacesFabricas.Interfaces.Servicos;
using LM.InterfacesFabricas.Utilidades;
using LM.Negocio.Objetos;
using LM.Negocio.Validadores;
using LM.Repositorios;
using LM.Repositorios.Conversores;
using LM.Repositorios.Interfaces;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace LM.Servicos
{
    public class ServicoDeModelo : IServicoDeModelo
    {
            private IRepositorioDeModelo _repositorio;

            private ValidadorDeModelo _validador;
            private ConversorDeModelo conversorDeModelo;

            public ServicoDeModelo()
            {
                _repositorio = FabricaDeRepositorios.Crie<IRepositorioDeModelo>();
                _validador = new ValidadorDeModelo(_repositorio);
                conversorDeModelo = new ConversorDeModelo();
            }

            public void Cadastre(DtoModelo dtomodelo)
            {

                var marcaObjeto = conversorDeModelo.Converta(dtomodelo);

                _validador.ValideCadastro(marcaObjeto);

                _repositorio.Cadastre(marcaObjeto);

            }

            public void Atualize(DtoModelo dtomodelo)
            {
                var marcaObjeto = conversorDeModelo.Converta(dtomodelo);

                _validador.ValideAtualizacao(marcaObjeto);

                _repositorio.Atualize(marcaObjeto);
            }

            public void Exclua(int codigo)
            {
                var modelo = _repositorio.Consulte(codigo);

                _validador.ValideExclusao(modelo);

                _repositorio.Exclua(modelo);
            }

            public DtoModelo Consulte(int codigo)
            {
                var modelo = _repositorio.Consulte(codigo);

                return conversorDeModelo.Converta(modelo);
            }

            public IList<DtoModelo> ConsulteTodos()
            {
                //return conversorDeModelo.Converta(_repositorio.ConsulteTodos());
                var lista = _repositorio.ConsulteTodos();
                return lista.Select(item => conversorDeModelo.Converta(item)).ToList();
            }

            public IList<DtoModelo> ConsultaTodosPorMarca(int codigoMarca)
            {
                var lista = _repositorio.ConsulteTodos().Where(m => m.Marca.Codigo == codigoMarca);
                return lista.Select(item => conversorDeModelo.Converta(item)).ToList();
            }
    }
}
